package com.aiwiown.snackmq.network.handler;

import com.aiwiown.snackmq.network.connection.ConnectionManager;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

/**
 * 一个可共享的处理器，专门负责管理连接的生命周期。
 * 它在连接建立时注册连接，在连接断开时移除连接。
 */
@Slf4j
@ChannelHandler.Sharable
public class ServerHandler extends ChannelInboundHandlerAdapter {

    private final ConnectionManager connectionManager;

    public ServerHandler(ConnectionManager connectionManager) {
        this.connectionManager = connectionManager;
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 当一个新连接被激活时，通知 ConnectionManager
        connectionManager.addConnection(ctx.channel());
        super.channelActive(ctx);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        // 当一个连接变为非激活状态（断开）时，通知 ConnectionManager
        connectionManager.removeConnection(ctx.channel());
        super.channelInactive(ctx);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        // 异常处理逻辑，例如记录日志并关闭连接
        log.error("Exception caught in server handler for channel {}:", ctx.channel().remoteAddress(), cause);
        ctx.close();
    }
}